#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
const int N = 110, MOD = 1e9 + 7;

int n, m;
int f[N][N][N];//i当前遇到的店的数量,j当前遇到花的数量,酒的数量

int main()
{
    close();
    cin >> n >> m;//n店 m花

    f[0][0][2] = 1;
    for (int i = 0; i <= n; i ++ )
    {
        for (int j = 0; j <= m; j ++ )
        {
            for (int k = 0; k <= m; k ++ )
            {
                int &v = f[i][j][k];
                if (i && k % 2 == 0) v = (v + f[i - 1][j][k / 2]) % MOD;
                if (j) v = (v + f[i][j - 1][k + 1]) % MOD;
            }

        }
    }
    cout << f[n][m - 1][1] << endl;
    return 0;
}
//状态转移
//最后为店 f[i-1][j][k/2] 且k为偶数         
//最后为花 f[i][j-1][k+1] j>=1才行,不然不合法
//很像路线(线性)问题的dp问题

